home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge08.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  4KB  |  226 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef USETINPUTPTRTO
  23. void usetinputptrto_() {
  24.   register cont  *rq = q;
  25.   char           *rc = c;
  26. register AFFIX A_0 = (rq + 0)->a;
  27. register AFFIX IP = (rq + -1)->a;
  28.   {
  29.     A_0->t = ip;
  30.     if ((IP->r == nil) && (IP->l == nil)) {
  31.       ip = IP->t;
  32.     } else {
  33.       sprinta(IP);
  34.       ip = rc;
  35.       *c++ = '\0';
  36.     }
  37.     q = rq + -3;
  38.     (*(rq + -2)->q) ();
  39.     rq = q - -2;
  40.     ip = A_0->t;
  41.     c = rc;
  42.   if (rc > cstore_top ) cstore_overflow();
  43.   }
  44.   (rq - 1)->a = IP;
  45.   (rq + 0)->a = A_0;
  46.   (rq + 1)->q = usetinputptrto_;
  47.   q = rq + 1;
  48. }
  49. #endif
  50.  
  51. #ifdef URESETINPUTPTR
  52. void uresetinputptr_() {
  53.   register cont  *rq = q;
  54.   register char  *a;
  55. register AFFIX A_0 = (rq + 0)->a;
  56.   {
  57.     if (*ip != '\0')
  58.       goto done;
  59.     a = ip;
  60.     ip = A_0->t;
  61.     q = rq + -2;
  62.     (*(rq + -1)->q) ();
  63.     rq = q - -1;
  64.     ip = a;
  65.   }
  66. done:
  67.   (rq + 0)->a = A_0;
  68.   (rq + 1)->q = uresetinputptr_;
  69.   q = rq + 1;
  70. }
  71. #endif
  72.  
  73. #ifdef UNESTARALT
  74. void unestaralt_() {
  75.   register cont  *rq = q;
  76. register AFFIX A_0 = (rq - 1)->a;
  77. register AFFIX A_1 = (rq + 0)->a;
  78.   register char  *sip = ip;
  79.   {
  80.     A_0->t = sip;
  81.     A_0->r = nil;
  82.     A_0->l = nil;
  83.     ip = A_1->t;
  84.     q = rq + -3;
  85.     (*(rq + -2)->q) ();
  86.     rq = q - -2;
  87.   }
  88.   ip = sip;
  89.   (rq - 1)->a = A_0;
  90.   (rq + 0)->a = A_1;
  91.   (rq + 1)->q = unestaralt_;
  92.   q = rq + 1;
  93. }
  94. #endif
  95.  
  96. #ifdef UNESTARSET
  97. void unestarset() {
  98.   register char  *csave = c, *sip = ip;
  99. register AFFIX A_0 = (q--)->a;
  100.   {
  101.  
  102.     A_0->t = csave;
  103.     A_0->r = nil;
  104.     A_0->l = nil;
  105.     do {
  106.       register char *rip = ip, *rc=c, special;
  107.       if (*ip ==  '\001' || *ip == '\002') { 
  108.         special = *ip;
  109.          *c++ = '\0';
  110.         q -= 1;
  111.         (*(*(q + 1)).q) ();
  112.         rc[0] = special;
  113.         rc[1] = rip [1];
  114.         rc[2] = rip [2];
  115.         rc[3] = rip [3];
  116.         rc[4] = rip [4];
  117.         rc[5] = special;
  118.         ip += 5;
  119.         c  += 5;
  120.      } else {
  121.          *c++ = '\0';
  122.          q -= 1;
  123.          (*(*(q + 1)).q) ();
  124.          *(c - 1) = *ip;
  125.      }
  126.   }
  127.   while (*ip++ != '\0');
  128.   }
  129.     ip = sip;
  130.     c = csave;
  131.     (++q)->a = A_0;
  132.     (++q)->q = unestarset;
  133. }
  134. #endif
  135.  
  136. #ifdef UMETATERMINAL
  137. void umetaterminal() {
  138.   register char  *sp, *term, *rip = ip, *rc = c;
  139.   AFFIX   A_0 = q->a;
  140.   term = A_0->t;
  141.   sp = rip;
  142.   if (((A_0->r) == nil) && ((A_0->l) == nil));
  143.   else {
  144.     term = c;
  145.     sprinta(A_0);
  146.     *c++ = '\0';
  147.   }
  148.   for (; *term != '\0'; rip++)
  149.     if (*term++ != *rip) {
  150.       (++q)->q = umetaterminal;
  151.       return;
  152.     }
  153.   q -= 2;
  154.   ip = rip;
  155.   (*(*(q + 1)).q) ();
  156.   (++q)->a = A_0;
  157.   (++q)->q = umetaterminal;
  158.   ip = sp;
  159.   c = rc;
  160.   if (rc > cstore_top ) cstore_overflow();
  161. }
  162. #endif
  163.  
  164. #ifdef DSETINPUTPTRTO
  165. int dsetinputptrto_(IP,A_0)
  166. register AFFIX A_0;
  167. register AFFIX IP;
  168. {
  169.   A_0->t = ip;
  170.   if ((IP->r == nil) && (IP->l == nil)) {
  171.     ip = IP->t;
  172.   } else {
  173.     ip = c;
  174.     sprinta(IP);
  175.     *c++ = '\0';
  176.   }
  177.   return true;
  178. }
  179. #endif
  180.  
  181. #ifdef DRESETINPUTPTR
  182. int dresetinputptr_(A_0)
  183. register AFFIX A_0;
  184. {
  185.   if (*ip != '\0')
  186.     return false;
  187.   ip = A_0->t;
  188.   return true;
  189. }
  190. #endif
  191.  
  192. #ifdef DNESTARALT
  193. int dnestaralt_(A_0,A_1)
  194. register AFFIX A_0;
  195. register AFFIX A_1;
  196. {
  197.   A_0->t = ip;
  198.   A_0->r = nil;
  199.   A_0->l = nil;
  200.   ip = A_1->t;
  201.   return true;
  202. }
  203. #endif
  204.  
  205. #ifdef DMETATERMINAL
  206. int dmetaterminal(A_0)
  207. register AFFIX A_0;
  208. {
  209.   register char  *term, *rip = ip;
  210.   term = A_0->t;
  211.   if (((A_0->r) == nil) && ((A_0->l) == nil));
  212.   else {
  213.     term = c;
  214.     sprinta(A_0);
  215.     *c++ = '\0';
  216.   }
  217.   for (; *term != '\0'; rip++)
  218.     if (*term++ != *rip) {
  219.       return false;
  220.     }
  221.   ip = rip;
  222.   return true;
  223. }
  224. #endif
  225.  
  226.